﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
/* 0-пустая клетка 1-корабль 2-пoдбитый корабль 3-промах */

namespace Battleship
{
    public partial class Form1 : Form
    {
        private myPait paint = new myPait();//объет рисование
        private readWriteFile rwf = new readWriteFile();//объект записи и чтения с файла
        private myCheck prov = new myCheck();//объект проверок
        private int mouseX1, mouseY1, mouseX2, mouseY2;
        private static bool flagMy = false;//проверка при заполнении своего поля
        private static bool flagEnemy = false;//проверка поля противника
        private static bool flagClear = false;//флаг очистки        
        private static bool flagFile = false;//флаг на определение наличия файла игры
        private static int boofShot = 0; //переменная в которуб загружается количество палуб корабля при высреле Игроком1
        private static bool flBoof = false, flBoof2 = false;
        private static bool flagEnd = false;//Кто выиграл
        private static bool flagEnable = true;//флаг для разморозки 2-й панели
        private static bool flagPanelMouseClick = false;//флаг если по панили1 совершен щелчек при заполнении кораблями
        private static string strP1 = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
        //private static string strP1 = "1111000001000000000111100000010000011000011000000000000000110000000000101010100000000000000000000000";
        //private static string strP2 = "1111000101000000010110000100000000000000000000011111100000000000000000100100000000000001000000000100";
        private static string strP2 = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
        private static int nPlayers = 0;//Сколько людей играют
        private static int panel2Enabe = 0;//разморозка 2-й панели
        private static int idWhoPlay = 0;//id кто ходит
        private static int whoPlay = 0;//Кто ходит
        private string roude = readWriteFile.roude;
        Thread th1;
       
        public Form1()
        {
            InitializeComponent();
            panel2.Enabled = false;
            if (File.Exists(roude))
            {
                flagFile = true;
            }
        }
        
        private void Form1_Load(object sender, EventArgs e)
        {
            if (File.Exists(roude))
            {
                flagFile = true; 
                nPlayers = rwf.howManyPlayers();
                nPlayers++;
                if (nPlayers > 2)
                {
                    MessageBox.Show("Уже есть 2 игрока");
                    return;
                }
                else
                {
                    rwf.writeFileTXT(nPlayers.ToString(), 4);
                }
            }
            if (!(File.Exists(roude)))
            {
                rwf.availabilityFile();//создание файла
                flagFile = false;
            }
        }
        
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            if (flagFile == false || flBoof == true)
            {
                strP1 = rwf.readFileTXT(1);
                System.Diagnostics.Debug.WriteLine("x: " + strP1);
                strP1 = createPael1(e, strP1, 1);
                System.Diagnostics.Debug.WriteLine("y: " + strP1);
                rwf.writeFileTXT(strP1, 1);
                flBoof = true;
                idWhoPlay = 1;
            }
            
            if (flagFile == true)
            {
                if (flBoof2 == true)
                {
                    strP2 = rwf.readFileTXT(2);
                }
                strP2 = createPael1(e, strP2, 2);
                rwf.writeFileTXT(strP2, 2);
                flBoof2 = true;
                idWhoPlay = 2;
            }
        }

        private void panel2_Paint(object sender, PaintEventArgs e)
        {
            if (flagFile == false || flBoof == true)
            {
                paint.line(e);
                if (File.Exists(roude))
                {
                    strP2 = rwf.readFileTXT(2);
                    strP2 = createPael2(e, strP2, 1);
                    flBoof = true;
                    rwf.writeFileTXT(strP2, 2);                   
                }
            }
            if (flagFile == true)
            {
                paint.line(e);               
                strP1 = rwf.readFileTXT(1);
                strP1 = createPael2(e, strP1, 2);
                rwf.writeFileTXT(strP1, 1);
            }
        }

        private void panel1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                mouseX1 = e.X;
                mouseY1 = e.Y;
                flagMy = true;
                flagPanelMouseClick = true;
                Refresh();
            }
        }

        private void panel2_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                mouseX2 = e.X;
                mouseY2 = e.Y;
                flagEnemy = true;
                Refresh();
            }
        }

        private void button3_Click(object sender, EventArgs e)//Готов игрок
        {
            int n = 0;//сколько готовых людей
            if (File.Exists(roude))
            {
                n = rwf.howManyReadyPlayers();
            }
            n++;
            bool answ = false;//проверка правильноски количества и палубности кораблей
            bool answ2 = false;//Проверка правильности расстановки
            if (flagFile == false)
            {
                answ = prov.checkPanel(strP1);
                answ2 = prov.checkPosition(strP1);
            }
            else if (flagFile == true)
            {
                answ = prov.checkPanel(strP2);
                answ2 = prov.checkPosition(strP2);
            }
            if (answ == true && answ2 == true)
            {
                textBox1.Text = "Верная расстановка.";
                th1 = new Thread(myUpdate);
                th1.Start();
                button4.Enabled = false;
                button3.Enabled = false;
                panel1.Enabled = false;
                rwf.writeFileTXT(n.ToString(), 5);
                //panel2.Enabled = true;//При запуске потоков закоментить
                flagMy = false;
            }
            else
            {
                textBox1.Text = "Не верная расстановка.";
            }
            
        }

        private void button4_Click(object sender, EventArgs e)//Очистка панели 1
        {
           flagClear = true;
           flagFile = false;
           Refresh();           
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)//При закрытии удаляем файл
        {
            if(th1 != null)
            {
                th1.Abort();
            }
            if (File.Exists(roude) && nPlayers <= 2)
            {
                int n = rwf.howManyReadyPlayers();
                int m = rwf.howManyPlayers();
                if (n == 2)
                {
                    n--;
                    rwf.writeFileTXT(n.ToString(), 5);
                }
                else if (n == 1)
                {
                    File.Delete(roude);
                }
                else if (m == 2)
                {
                    m--;
                    rwf.writeFileTXT(n.ToString(), 4);
                }
                else if (m == 1)
                {
                    File.Delete(roude);
                }
            }
        }

        public string createPael1(PaintEventArgs e, string str, int id)//прорисовка кораблей  и т.д. на панели 1
        {
            if (flagClear == true)
            {
                paint.line(e);
                str = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
                for (int i = 0; i < 100; i++)
                {
                    if (str[i] == '1')
                    {
                        paint.paintRectMy(e, (i % 10) * 20, (i / 10) * 20);
                    }
                }
                flagClear = false;
            }
            else
            {
                paint.line(e);
                if (flagMy == true)
                {

                    int elem = paint.paintRectMy(e, mouseX1, mouseY1);
                    if (str[elem] == '1' && flagPanelMouseClick == true)
                    {
                        str = str.Remove(elem, 1).Insert(elem, "0");
                        paint.paintRectMyNull(e, mouseX1, mouseY1);
                        flagPanelMouseClick = false;
                    }
                    else if (str[elem] == '0' && flagPanelMouseClick == true)
                    {
                        str = str.Remove(elem, 1).Insert(elem, "1");
                        flagPanelMouseClick = false;
                    }
                    for (int i = 0; i < 100; i++)
                    {
                        if (str[i] == '1')
                        {
                            paint.paintRectMy(e, (i % 10) * 20, (i / 10) * 20);
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < 100; i++)
                    {
                        if (str[i] == '1')
                        {
                            paint.paintRectMy(e, (i % 10) * 20, (i / 10) * 20);
                        }
                        else if (str[i] == '2')
                        {
                            paint.paintShot(e, (i % 10) * 20, (i / 10) * 20, 2);
                        }
                        else if (str[i] == '3')
                        {
                            paint.paintShot(e, (i % 10) * 20, (i / 10) * 20, 3);
                        }
                    }
                }
            }
            return str;
        }

        public string createPael2(PaintEventArgs e, string str, int id)//прорисовка кораблей выстрелов и т.д. на панели 2
        {
            paint.line(e);
            int n = paint.indexStr(mouseX2, mouseY2);
            
            if (flagEnemy == true)
            {
                if (str[n] == '0')
                {
                    str = str.Remove(n, 1).Insert(n, "3");
                    textBox1.Text = "Мимо!";
                    if (id == 1)//запись кто ходит
                    {
                        rwf.writeFileTXT("2", 3);
                    }
                    else if (id == 2)
                    {
                        rwf.writeFileTXT("1", 3);
                    }
                }
                else if (str[n] == '1')
                {
                    boofShot = prov.checkAfterSort(str, n);                    
                    str = str.Remove(n, 1).Insert(n, "2");
                    bool flShot = prov.checkAfterSort2(str, n, boofShot);
                    if (flShot == true)
                    {
                        textBox1.Text = "Убил!";
                        str = prov.checkPast(str, n);
                        boofShot = 0;
                    }
                    else
                    {
                        textBox1.Text = "Ранил!";
                    }
                    flagEnd = true;
                }
                for (int i = 0; i < 100; i++)//прорисовка поля
                {
                    if (str[i] == '2')
                    {
                        paint.paintShot(e, (i % 10) * 20, (i / 10) * 20, 2);
                    }
                    else if (str[i] == '3')
                    {
                        paint.paintShot(e, (i % 10) * 20, (i / 10) * 20, 3);
                    }
                }
            }
            return str;
        }

        private static bool flUpEnd = true;
        public void myUpdate()//фунция перерисовки и не только
        {
            while (true)
            {
                if (File.Exists(roude))
                {
                    panel1.Invoke((Action)UpdatePanel);
                    if (File.Exists(roude))
                    {
                        if (flagEnable == true)
                        {
                            panel2Enabe = rwf.howManyReadyPlayers();
                        }
                        if (panel2Enabe == 2)
                        {
                            if (flUpEnd == true)
                            {
                                flagEnd = true;
                            }
                            whoPlay = rwf.whoMove();
                            bool panel2Enabled = false;
                            if (idWhoPlay == 1)
                            {
                                if (whoPlay == 1)
                                {
                                    panel1.BackColor = Color.FromArgb(170, Color.Gray);
                                    panel2.BackColor = Color.FromArgb(0, Color.Gray);
                                    panel2Enabled = true;
                                }
                                else if (whoPlay == 2)
                                {
                                    panel1.BackColor = Color.FromArgb(0, Color.Gray);
                                    panel2.BackColor = Color.FromArgb(170, Color.Gray);
                                    panel2Enabled = false;
                                }

                            }
                            else if (idWhoPlay == 2)
                            {
                                if (whoPlay == 1)
                                {
                                    panel1.BackColor = Color.FromArgb(0, Color.Gray);
                                    panel2.BackColor = Color.FromArgb(170, Color.Gray);
                                    panel2Enabled = false;
                                }
                                else if (whoPlay == 2)
                                {
                                    panel1.BackColor = Color.FromArgb(170, Color.Gray);
                                    panel2.BackColor = Color.FromArgb(0, Color.Gray);
                                    panel2Enabled = true;
                                }

                            }

                            panel2.Invoke((Action<bool>)EnadlePanel, panel2Enabled);
                        }
                    }
                    //Вывод сообщения кто выиграл
                    if (flagEnd == true)
                    {
                        string str1 = rwf.readFileTXT(1);
                        string str2 = rwf.readFileTXT(2);
                        int countStr1 = 0, countStr2 = 0;
                        for (int i = 0; i < str1.Length; i++)
                        {
                            if (str1[i] == '1')
                            {
                                countStr1++;
                            }
                        }
                        for (int i = 0; i < str2.Length; i++)
                        {
                            if (str2[i] == '1')
                            {
                                countStr2++;
                            }
                        }
                        if (countStr1 == 0)
                        {
                            flUpEnd = false;
                            flagEnd = false;
                            MessageBox.Show("Игрок 2 выиграл!!!");
                            panel1.Enabled = false;
                            panel2.Enabled = false;
                            th1.Abort();                           
                        }
                        else if (countStr2 == 0)
                        {
                            flUpEnd = false;
                            flagEnd = false;
                            MessageBox.Show("Игрок 1 выиграл!!!");
                            panel1.Enabled = false;
                            panel2.Enabled = false;
                            th1.Abort();

                        }
                    }
                }
                Thread.Sleep(150);
            }
        }

        public void UpdatePanel()
        {
            panel1.Refresh();
        }

        public void EnadlePanel(bool enable)
        {
            panel2.Enabled = enable;
        }  

    }
}
